<?php
/**
 * @version     $Id: view.json.php 1579 2012-05-09 14:19:31Z lefteris.kavadas $
 * @package     K2
 * @author      JoomlaWorks http://www.joomlaworks.net
 * @copyright   Copyright (c) 2006 - 2012 JoomlaWorks Ltd. All rights reserved.
 * @license     GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class K2ViewItemlist extends JView
{

    function display($tpl = null)
    {

        $mainframe = JFactory::getApplication();
        $params = K2HelperUtilities::getParams('com_k2');
        $document = JFactory::getDocument();
        if (K2_JVERSION == '15')
        {
            $document->setMimeEncoding('application/json');
            $document->setType('json');
        }
        $model = $this->getModel('itemlist');
        
        //Set limit for model
        $limit = JRequest::getInt('limit');
        if($limit > 100 || $limit == 0)
        {
            $limit = 100;
            JRequest::setVar('limit', $limit);
        }
        $page = JRequest::getInt('page');
        if($page <= 0)
        {
            $limitstart = 0;
        }
        else {
            $page--;
            $limitstart = $page*$limit;
        }
        JRequest::setVar('limitstart', $limitstart);
                
        $view = JRequest::getWord('view');
        $task = JRequest::getWord('task');

        $response = new JObject();
        unset($response->_errors);
        
        // Site
        $response->site = new stdClass();
        $uri = JURI::getInstance();
        $response->site->url = $uri->toString(array('scheme', 'host', 'port'));
        $config = JFactory::getConfig();
        $response->site->name = $config->getValue('config.sitename');

        //Get data depending on task
        switch ($task)
        {

            case 'category' :
                //Get category
                $id = JRequest::getInt('id');
                JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');
                $category = JTable::getInstance('K2Category', 'Table');
                $category->load($id);

                // State Check
                if (!$category->published || $category->trash)
                {
                    JError::raiseError(404, JText::_('K2_CATEGORY_NOT_FOUND'));
                }

                //Access check
                $user = JFactory::getUser();
                if (K2_JVERSION == '16')
                {
                    if (!in_array($category->access, $user->authorisedLevels()))
                    {
                        JError::raiseError(403, JText::_('K2_ALERTNOTAUTH'));
                    }
                    $languageFilter = $mainframe->getLanguageFilter();
                    $languageTag = JFactory::getLanguage()->getTag();
                    if ($languageFilter && $category->language != $languageTag && $category->language != '*')
                    {
                        return;
                    }
                }
                else
                {
                    if ($category->access > $user->get('aid', 0))
                    {
                        JError::raiseError(403, JText::_('K2_ALERTNOTAUTH'));
                    }
                }

                //Merge params
                $cparams = new JParameter($category->params);
                if ($cparams->get('inheritFrom'))
                {
                    $masterCategory = JTable::getInstance('K2Category', 'Table');
                    $masterCategory->load($cparams->get('inheritFrom'));
                    $cparams = new JParameter($masterCategory->params);
                }
                $params->merge($cparams);

                //Category link
                $category->link = urldecode(JRoute::_(K2HelperRoute::getCategoryRoute($category->id.':'.urlencode($category->alias))));

                //Category image
                $category->image = K2HelperUtilities::getCategoryImage($category->image, $params);

                //Category plugins
                $dispatcher = JDispatcher::getInstance();
                JPluginHelper::importPlugin('content');
                $category->text = $category->description;
                
                if(K2_JVERSION=='16')
                {
                    $dispatcher->trigger('onContentPrepare', array ('com_k2.category', &$category, &$params, $limitstart));
                }
                else {
                    $dispatcher->trigger('onPrepareContent', array ( & $category, &$params, $limitstart));
                }

                $category->description = $category->text;

                //Category K2 plugins
                $category->event->K2CategoryDisplay = '';
                JPluginHelper::importPlugin('k2');
                $results = $dispatcher->trigger('onK2CategoryDisplay', array(&$category, &$params, $limitstart));
                $category->event->K2CategoryDisplay = trim(implode("\n", $results));
                $category->text = $category->description;
                $dispatcher->trigger('onK2PrepareContent', array(&$category, &$params, $limitstart));
                $category->description = $category->text;

                //Category children
                $ordering = $params->get('subCatOrdering');
                $children = $model->getCategoryFirstChildren($id, $ordering);
                $subCategories = array();
                if (count($children))
                {
                    foreach ($children as $child)
                    {
                        if ($params->get('subCatTitleItemCounter'))
                        {
                            $child->numOfItems = $model->countCategoryItems($child->id);
                        }
                        $child->image = K2HelperUtilities::getCategoryImage($child->image, $params);
                        $child->link = urldecode(JRoute::_(K2HelperRoute::getCategoryRoute($child->id.':'.urlencode($child->alias))));
                        unset($child->params);
                        unset($child->access);
                        unset($child->published);
                        unset($child->trash);
                        unset($child->language);
                        $subCategories[] = $child;
                    }
                }

                //Set featured flag
                JRequest::setVar('featured', $params->get('catFeaturedItems'));

                //Set title
                $title = $category->name;

                // Set ordering
                if ($params->get('singleCatOrdering'))
                {
                    $ordering = $params->get('singleCatOrdering');
                }
                else
                {
                    $ordering = $params->get('catOrdering');
                }

                // Set parameters prefix
                $prefix = 'cat';
                // Prepare the JSON category object;
                $row = new JObject();
                unset($row->_errors);
                $row->id = $category->id;
                $row->name = $category->name;
                $row->alias = $category->alias;
                $row->link = $category->link;
                $row->parent = $category->parent;
                $row->extraFieldsGroup = $category->extraFieldsGroup;
                $row->image = $category->image;
                $row->ordering = $category->ordering;
                //$row->plugins = $category->plugins;
                $row->events = $category->event;
                $row->chidlren = $subCategories;
                $response->category = $row;
                break;

            case 'user' :
                //Get user
                $id = JRequest::getInt('id');
                $userObject = JFactory::getUser($id);

                //Check user status
                if ($userObject->block)
                {
                    JError::raiseError(404, JText::_('K2_USER_NOT_FOUND'));
                }

                //Get K2 user profile
                $userObject->profile = $model->getUserProfile();
                
                

                //User image
                $userObject->avatar = K2HelperUtilities::getAvatar($userObject->id, $userObject->email, $params->get('userImageWidth'));

                //User K2 plugins
                $userObject->event->K2UserDisplay = '';
                if (is_object($userObject->profile) && $userObject->profile->id > 0)
                {
                    $dispatcher = &JDispatcher::getInstance();
                    JPluginHelper::importPlugin('k2');
                    $results = $dispatcher->trigger('onK2UserDisplay', array(&$userObject->profile, &$params, $limitstart));
                    $userObject->event->K2UserDisplay = trim(implode("\n", $results));

                }

                //Set title
                $title = $userObject->name;

                // Set ordering
                $ordering = $params->get('userOrdering');

                // Set parameters prefix
                $prefix = 'user';
                // Prepare the JSON user object;
                $row = new JObject();
                unset($row->_errors);
                //$row->id = $userObject->id;
                $row->name = $userObject->name;
                //$row->username = $userObject->username;
                if(isset($userObject->profile->plugins))
                {
                    unset($userObject->profile->plugins);
                }
                $row->profile = $userObject->profile;
                $row->avatar = $userObject->avatar;
                $row->events = $userObject->event;
                $response->user = $row;
                break;

            case 'tag' :
                //Set limit
                $limit = $params->get('tagItemCount');

                //set title
                $title = JText::_('K2_DISPLAYING_ITEMS_BY_TAG').' '.JRequest::getVar('tag');

                // Set ordering
                $ordering = $params->get('tagOrdering');

                // Set parameters prefix
                $prefix = 'tag';
                $response->tag = JRequest::getVar('tag');
                break;

            case 'search' :
               
                //Set title
                $title = JText::_('K2_SEARCH_RESULTS_FOR').' '.JRequest::getVar('searchword');

                // Set parameters prefix
                $prefix = 'generic';
                $response->search = JRequest::getVar('searchword');
                break;

            case 'date' :

                // Set title
                if (JRequest::getInt('day'))
                {
                    $date = strtotime(JRequest::getInt('year').'-'.JRequest::getInt('month').'-'.JRequest::getInt('day'));
                    $dateFormat = (K2_JVERSION == '15') ? '%A, %d %B %Y' : 'l, d F Y';
                    $title = JText::_('K2_ITEMS_FILTERED_BY_DATE').' '.JHTML::_('date', $date, $dateFormat);
                }
                else
                {
                    $date = strtotime(JRequest::getInt('year').'-'.JRequest::getInt('month'));
                    $dateFormat = (K2_JVERSION == '15') ? '%B %Y' : 'F Y';
                    $title = JText::_('K2_ITEMS_FILTERED_BY_DATE').' '.JHTML::_('date', $date, $dateFormat);
                }
                // Set ordering
                $ordering = 'rdate';

                // Set parameters prefix
                $prefix = 'generic';
                $response->date = JHTML::_('date', $date, $dateFormat);
                break;

            default :
                $user = JFactory::getUser();

                //Set limit
                $limit = $params->get('num_leading_items') + $params->get('num_primary_items') + $params->get('num_secondary_items') + $params->get('num_links');
                //Set featured flag
                JRequest::setVar('featured', $params->get('catFeaturedItems'));

                //Set title
                $title = $params->get('page_title');

                // Set ordering
                $ordering = $params->get('catOrdering');

                // Set parameters prefix
                $prefix = 'cat';

                break;
        }

        if (!isset($ordering))
        {
            $items = $model->getData();
        }
        else
        {
            $items = $model->getData($ordering);
        }

        //Prepare items
        $user = JFactory::getUser();
        $cache = JFactory::getCache('com_k2_extended');
        $model = $this->getModel('item');
        $rows = array();
        for ($i = 0; $i < sizeof($items); $i++)
        {

            //Item group
            if ($task == "category" || $task == "")
            {
                $items[$i]->itemGroup = 'links';
                
                if ($i < ($params->get('num_links') + $params->get('num_leading_items') + $params->get('num_primary_items') + $params->get('num_secondary_items')))
                    $items[$i]->itemGroup = 'links';
                if ($i < ($params->get('num_secondary_items') + $params->get('num_leading_items') + $params->get('num_primary_items')))
                    $items[$i]->itemGroup = 'secondary';
                if ($i < ($params->get('num_primary_items') + $params->get('num_leading_items')))
                    $items[$i]->itemGroup = 'primary';
                if ($i < $params->get('num_leading_items'))
                    $items[$i]->itemGroup = 'leading';
            }
            else
            {
                $items[$i]->itemGroup = '';
            }

            $itemParams = new JParameter($items[$i]->params);
            $itemParams->set($prefix.'ItemIntroText', true);
            $itemParams->set($prefix.'ItemFullText', true);
            $itemParams->set($prefix.'ItemTags', true);
            $itemParams->set($prefix.'ItemExtraFields', true);
            $itemParams->set($prefix.'ItemAttachments', true);
            $itemParams->set($prefix.'ItemRating', true);
            $itemParams->set($prefix.'ItemAuthor', true);
            $itemParams->set($prefix.'ItemImageGallery', true);
            $itemParams->set($prefix.'ItemVideo', true);
            $itemParams->set($prefix.'ItemImage', true);
            $items[$i]->params = $itemParams->toString();

            //Check if model should use cache for preparing item even if user is logged in
            if ($user->guest || $task == 'tag' || $task == 'search' || $task == 'date')
            {
                $cacheFlag = true;
            }
            else
            {
                $cacheFlag = true;
                if (K2HelperPermissions::canEditItem($items[$i]->created_by, $items[$i]->catid))
                {
                    $cacheFlag = false;
                }
            }

            //Prepare item
            if ($cacheFlag)
            {
                $hits = $items[$i]->hits;
                $items[$i]->hits = 0;
                JTable::getInstance('K2Category', 'Table');
                $items[$i] = $cache->call(array('K2ModelItem', 'prepareItem'), $items[$i], $view, $task);
                $items[$i]->hits = $hits;
            }
            else
            {
                $items[$i] = $model->prepareItem($items[$i], $view, $task);
            }

            //Plugins
            $items[$i] = $model->execPlugins($items[$i], $view, $task);

            //Trigger comments counter event
            $dispatcher = &JDispatcher::getInstance();
            JPluginHelper::importPlugin('k2');
            $results = $dispatcher->trigger('onK2CommentsCounter', array(&$items[$i], &$params, $limitstart));
            $items[$i]->event->K2CommentsCounter = trim(implode("\n", $results));

            // Set default image
            if ($task == 'user' || $task == 'tag' || $task == 'search' || $task == 'date')
            {
                $items[$i]->image = (isset($items[$i]->imageGeneric)) ? $items[$i]->imageGeneric : '';
            }
            else
            {
                K2HelperUtilities::setDefaultImage($items[$i], $view, $params);
            }

            $rows[] = $model->prepareJSONItem($items[$i]);

        }
        
        $response->items = $rows;

        // Output
        $json = json_encode($response);
        $callback = JRequest::getCmd('callback');
        if ($callback)
        {
            $document->setMimeEncoding('application/javascript');
            echo $callback.'('.$json.')';
        }
        else
        {
            echo $json;
        }

    }

}
